/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_service_public.h
 *
 * @brief 提供TEE服务的公共函数，供开发者使用。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_service_public.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef _TEE_SERVICE_PUBLIC_H_
#define _TEE_SERVICE_PUBLIC_H_

#include "tee_defines.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义函数指针类型。
 *
 * @since 20
 */
typedef void (*func_ptr)(void);

/**
 * @brief 定义TEE服务的消息队列大小。
 *
 * @since 20
 */
#define TEE_SERVICE_MSG_QUEUE_SIZE 100

/**
 * @brief 定义镜像哈希值的最大长度。
 *
 * @since 20
 */
#define MAX_IMAGE_HASH_SIZE 64

/**
 * @brief 定义消息的参数。
 *
 * @since 20
 */
typedef struct {
    /** 参数0。 */
    uint64_t arg0;
    /** 参数1。 */
    uint64_t arg1;
    /** 参数2。 */
    uint64_t arg2;
    /** 参数3。 */
    uint64_t arg3;
    /** 参数4。 */
    uint64_t arg4;
    /** 参数5。 */
    uint64_t arg5;
    /** 参数6。 */
    uint64_t arg6;
    /** 参数7。 */
    uint64_t arg7;
} args_t;

/**
 * @brief 定义TA的注册信息。
 *
 * @since 20
 */
struct reg_ta_info {
    /** TA的任务ID。 */
    uint32_t taskid;
    /** TA的UUID（通用唯一标识符）。 */
    TEE_UUID uuid;
    /** 用户ID。 */
    uint32_t userid;
    /** 仅用于SSA，其他任务应忽略此字段。 */
    bool ssa_enum_enable;
};

/**
 * @brief 定义TEE服务的 IPC（进程间通信）消息。
 *
 * @since 20
 */
typedef union {
    /** 参数数据。 */
    args_t args_data;
    /** TA的注册信息。 */
    struct reg_ta_info reg_ta;
} tee_service_ipc_msg;

/**
 * @brief 定义TEE服务的IPC请求消息。
 *
 * @since 20
 */
struct tee_service_ipc_msg_req {
    /** 请求的命令标识。 */
    uint32_t cmd;
    /** 请求中携带的IPC消息。 */
    tee_service_ipc_msg msg;
};

/**
 * @brief 定义TEE服务的IPC响应消息。
 *
 * @since 20
 */
typedef struct {
    /** 请求的返回结果。 */
    TEE_Result ret;
    /** 响应中携带的IPC消息。 */
    tee_service_ipc_msg msg;
} tee_service_ipc_msg_rsp;

/**
 * @brief 定义TEE服务的消息。
 *
 * @since 20
 */
typedef struct {
    /** 消息ID，标识消息的唯一标识符。 */
    uint32_t msg_id;
    /** 发送该消息的发送者ID。 */
    uint32_t sender;
    /** 消息数据。 */
    tee_service_ipc_msg msg;
} tee_service_msg_t;

/**
 * @brief 定义TEE服务的消息队列。
 *
 * @since 20
 */
typedef struct {
    /** 指向队列的输入位置。 */
    uint32_t in;
    /** 指向队列的输出位置。 */
    uint32_t out;
    /** 消息数组，存储队列中的消息。 */
    tee_service_msg_t msg[TEE_SERVICE_MSG_QUEUE_SIZE];
} tee_service_msg_queue_t;

/**
 * @brief 向指定服务发送IPC同步消息并接收来自该服务的响应。
 *
 * @param task_name 指向接收方任务名称的指针。
 * @param snd_cmd 要发送的消息的命令ID。
 * @param snd_msg 指向发送消息的指针。
 * @param ack_cmd 要接收的应答命令(ack cmd)的ID。
 * @param rsp_msg 指向服务响应消息的指针。
 *
 * @since 20
 */
void tee_common_ipc_proc_cmd(const char *task_name,
                             uint32_t snd_cmd, const tee_service_ipc_msg *snd_msg,
                             uint32_t ack_cmd, tee_service_ipc_msg_rsp *rsp_msg);

#ifdef __cplusplus
}
#endif

#endif
/** @} */